home *** CD-ROM | disk | FTP | other *** search
/ Java Primer Plus / Java Primer Plus (Waite Group Proess)(1996).iso / java_Win / demo / MoleculeViewer / XYZChemModel.class (.txt) < prev   
Encoding:
Java Class File  |  1995-12-01  |  3.6 KB  |  240 lines

  1. import java.awt.Graphics;
  2. import java.io.BufferedInputStream;
  3. import java.io.InputStream;
  4. import java.io.StreamTokenizer;
  5. import java.util.Hashtable;
  6.  
  7. class XYZChemModel {
  8.    float[] vert;
  9.    Atom[] atoms;
  10.    int[] tvert;
  11.    int[] ZsortMap;
  12.    int nvert;
  13.    int maxvert;
  14.    static Hashtable atomTable = new Hashtable();
  15.    static Atom defaultAtom;
  16.    boolean transformed;
  17.    Matrix3D mat;
  18.    float xmin;
  19.    float xmax;
  20.    float ymin;
  21.    float ymax;
  22.    float zmin;
  23.    float zmax;
  24.  
  25.    XYZChemModel() {
  26.       this.mat = new Matrix3D();
  27.       this.mat.xrot((double)20.0F);
  28.       this.mat.yrot((double)30.0F);
  29.    }
  30.  
  31.    XYZChemModel(InputStream var1) throws Exception {
  32.       this();
  33.       StreamTokenizer var2 = new StreamTokenizer(new BufferedInputStream(var1, 4000));
  34.       var2.eolIsSignificant(true);
  35.       var2.commentChar(35);
  36.  
  37.       while(true) {
  38.          switch (var2.nextToken()) {
  39.             case -3:
  40.                String var3 = var2.sval;
  41.                double var4 = (double)0.0F;
  42.                double var6 = (double)0.0F;
  43.                double var8 = (double)0.0F;
  44.                if (var2.nextToken() == -2) {
  45.                   var4 = var2.nval;
  46.                   if (var2.nextToken() == -2) {
  47.                      var6 = var2.nval;
  48.                      if (var2.nextToken() == -2) {
  49.                         var8 = var2.nval;
  50.                      }
  51.                   }
  52.                }
  53.  
  54.                this.addVert(var3, (float)var4, (float)var6, (float)var8);
  55.  
  56.                while(var2.ttype != 10 && var2.ttype != -1) {
  57.                   var2.nextToken();
  58.                }
  59.             case -2:
  60.             default:
  61.                break;
  62.             case -1:
  63.                var1.close();
  64.                if (var2.ttype != -1) {
  65.                   throw new Exception(var2.toString());
  66.                } else {
  67.                   return;
  68.                }
  69.          }
  70.       }
  71.    }
  72.  
  73.    int addVert(String var1, float var2, float var3, float var4) {
  74.       int var5 = this.nvert;
  75.       if (var5 >= this.maxvert) {
  76.          if (this.vert == null) {
  77.             this.maxvert = 100;
  78.             this.vert = new float[this.maxvert * 3];
  79.             this.atoms = new Atom[this.maxvert];
  80.          } else {
  81.             this.maxvert *= 2;
  82.             float[] var6 = new float[this.maxvert * 3];
  83.             System.arraycopy(this.vert, 0, var6, 0, this.vert.length);
  84.             this.vert = var6;
  85.             Atom[] var7 = new Atom[this.maxvert];
  86.             System.arraycopy(this.atoms, 0, var7, 0, this.atoms.length);
  87.             this.atoms = var7;
  88.          }
  89.       }
  90.  
  91.       Atom var9 = (Atom)atomTable.get(var1.toLowerCase());
  92.       if (var9 == null) {
  93.          var9 = defaultAtom;
  94.       }
  95.  
  96.       this.atoms[var5] = var9;
  97.       var5 *= 3;
  98.       this.vert[var5] = var2;
  99.       this.vert[var5 + 1] = var3;
  100.       this.vert[var5 + 2] = var4;
  101.       return this.nvert++;
  102.    }
  103.  
  104.    void transform() {
  105.       if (!this.transformed && this.nvert > 0) {
  106.          if (this.tvert == null || this.tvert.length < this.nvert * 3) {
  107.             this.tvert = new int[this.nvert * 3];
  108.          }
  109.  
  110.          this.mat.transform(this.vert, this.tvert, this.nvert);
  111.          this.transformed = true;
  112.       }
  113.    }
  114.  
  115.    void paint(Graphics var1) {
  116.       if (this.vert != null && this.nvert > 0) {
  117.          this.transform();
  118.          int[] var2 = this.tvert;
  119.          int[] var3 = this.ZsortMap;
  120.          if (var3 == null) {
  121.             this.ZsortMap = var3 = new int[this.nvert];
  122.             int var4 = this.nvert;
  123.  
  124.             while(true) {
  125.                --var4;
  126.                if (var4 < 0) {
  127.                   break;
  128.                }
  129.  
  130.                var3[var4] = var4 * 3;
  131.             }
  132.          }
  133.  
  134.          int var9 = this.nvert - 1;
  135.  
  136.          boolean var5;
  137.          do {
  138.             --var9;
  139.             if (var9 < 0) {
  140.                break;
  141.             }
  142.  
  143.             var5 = 0;
  144.  
  145.             for(int var6 = 0; var6 <= var9; ++var6) {
  146.                int var7 = var3[var6];
  147.                int var8 = var3[var6 + 1];
  148.                if (var2[var7 + 2] > var2[var8 + 2]) {
  149.                   var3[var6 + 1] = var7;
  150.                   var3[var6] = var8;
  151.                   var5 = 1;
  152.                }
  153.             }
  154.          } while(var5);
  155.  
  156.          var5 = this.nvert;
  157.          if (var5 > 0 && this.nvert > 0) {
  158.             for(int var11 = 0; var11 < var5; ++var11) {
  159.                int var12 = var3[var11];
  160.                int var13 = var2[var12 + 2];
  161.                if (var13 < 0) {
  162.                   var13 = 0;
  163.                }
  164.  
  165.                if (var13 > 15) {
  166.                   var13 = 15;
  167.                }
  168.  
  169.                this.atoms[var12 / 3].paint(var1, var2[var12], var2[var12 + 1], var13);
  170.             }
  171.  
  172.          }
  173.       }
  174.    }
  175.  
  176.    void findBB() {
  177.       if (this.nvert > 0) {
  178.          float[] var1 = this.vert;
  179.          float var2 = var1[0];
  180.          float var3 = var2;
  181.          float var4 = var1[1];
  182.          float var5 = var4;
  183.          float var6 = var1[2];
  184.          float var7 = var6;
  185.          int var8 = this.nvert * 3;
  186.  
  187.          while(true) {
  188.             var8 -= 3;
  189.             if (var8 <= 0) {
  190.                this.xmax = var3;
  191.                this.xmin = var2;
  192.                this.ymax = var5;
  193.                this.ymin = var4;
  194.                this.zmax = var7;
  195.                this.zmin = var6;
  196.                return;
  197.             }
  198.  
  199.             float var9 = var1[var8];
  200.             if (var9 < var2) {
  201.                var2 = var9;
  202.             }
  203.  
  204.             if (var9 > var3) {
  205.                var3 = var9;
  206.             }
  207.  
  208.             float var10 = var1[var8 + 1];
  209.             if (var10 < var4) {
  210.                var4 = var10;
  211.             }
  212.  
  213.             if (var10 > var5) {
  214.                var5 = var10;
  215.             }
  216.  
  217.             float var11 = var1[var8 + 2];
  218.             if (var11 < var6) {
  219.                var6 = var11;
  220.             }
  221.  
  222.             if (var11 > var7) {
  223.                var7 = var11;
  224.             }
  225.          }
  226.       }
  227.    }
  228.  
  229.    static {
  230.       atomTable.put("c", new Atom(0, 0, 0));
  231.       atomTable.put("h", new Atom(210, 210, 210));
  232.       atomTable.put("n", new Atom(0, 0, 255));
  233.       atomTable.put("o", new Atom(255, 0, 0));
  234.       atomTable.put("p", new Atom(255, 0, 255));
  235.       atomTable.put("s", new Atom(255, 255, 0));
  236.       atomTable.put("hn", new Atom(150, 255, 150));
  237.       defaultAtom = new Atom(255, 100, 200);
  238.    }
  239. }
  240.